/**
 * Copyright(c) 2014 Xunton Solutions
 *
 * History:
 *   15-1-10 下午3:59 Created by dwzhang
 */
package com.jade.modules.region;

import java.util.ArrayList;
import java.util.List;

import com.jade.framework.base.context.ApplicationContextUtils;
import com.jade.framework.base.criterion.Criteria;
import com.jade.framework.base.util.PagingList;
import org.apache.commons.lang3.StringUtils;

/**
 * 地区的工具类
 *
 * @author sky
 * @version 1.0 13-5-31 下午4:03
 */
public class RegionUtils
{
    private static RegionManager regionManager = null;

    protected static RegionManager getRegionManager()
    {
        if (regionManager == null) {
            regionManager = ApplicationContextUtils.getBean("module_regionManager");
        }
        return regionManager;
    }

    /**
     * 新增一个根地区.
     *
     * @param region 新增地区
     */
    public static void addRegion(Region region)
            throws RegionException
    {
        getRegionManager().addRegion(region);
    }

    /**
     * 更新地区信息。
     *
     * @param region 新增地区
     */
    public static void updateRegion(Region region)
            throws RegionException
    {
        getRegionManager().updateRegion(region);
    }

    /**
     * 移除一个或者多个地区。
     *
     * @param ids 地区标识
     */
    public static void removeRegion(String... ids)
            throws RegionException
    {
        getRegionManager().removeRegion(ids);
    }

    /**
     * 根据地区标识获取地区.
     *
     * @param id 地区标识
     */
    public static Region getRegion(String id)
    {
        return getRegionManager().getRegion(id);
    }

    /**
     * 根据名称及层级获取地区
     *
     * @param name  地区中文描述
     * @param type 地区类型
     * @return 满足条件的地区
     */
    public static Region getRegionByName(String name, String type)
    {
        return getRegionByName(name, type);
    }

    /**
     * 根据名称及层级获取地区
     *
     * @param parentId 上级地区ID（可以是上一级，也可以是上面多级）
     * @param name  名称
     * @return 满足条件的地区
     */
    public static Region getSubRegion(String parentId, String name)
    {
        return getRegionManager().getSubRegion(parentId, name);
    }

    /**
     * 列出一个地区下面的所有子地区。仅直属子地区
     *
     * @param parentId 上级地区ID
     * @return 匹配的地区列表
     */
    public static List<Region> listRegion(String parentId)
    {
        return getRegionManager().listRegion(parentId);
    }

    /**
     * 列出一个地区下面的子地区，包括指定级别的子地区
     *
     * @param parentId 上级地区ID
     * @return 匹配的地区列表
     */
    public static List<Region> listRegion(String parentId, int level)
    {
        return getRegionManager().listRegion(parentId, level);
    }

    /**
     * 列出一个地区下面的所有子地区。仅直属子地区
     *
     * @param parentId 上级地区ID
     * @return 匹配的地区列表
     */
    public static List<String> getSubIds(String parentId)
    {
        List<Region> regions = getRegionManager().listRegion(parentId);
        List<String> ids = new ArrayList<String>();
        for (Region region : regions) {
            ids.add(region.getId());
        }
        return ids;
    }

    /**
     * 根据关键字查询地区信息。
     *
     * @param criteria 查询条件
     * @return 匹配的地区列表
     */
    public static List<Region> listRegion(Criteria criteria)
    {
        return getRegionManager().listRegion(criteria);
    }

    /**
     * 根据关键字查询地区信息。
     *
     * @param criteria 查询条件
     * @return 匹配的地区列表
     */
    public static PagingList<Region> queryRegion(Criteria criteria)
    {
        return getRegionManager().queryRegion(criteria);
    }

    public static String getName(String id)
    {
        return getName(id, true);
    }

    public static String getName(String id, boolean abbr)
    {
        Region region = getRegion(id);
        return getName(region, abbr);
    }

    public static String getName(Region region, boolean abbr)
    {
        if (region != null) {
            if (abbr && StringUtils.isNotBlank(region.getAbbrCnName())) {
                return region.getAbbrCnName();
            }
            else {
                return region.getCnName();
            }
        }
        else {
            return null;
        }
    }

    public static String[] getIds(String id)
    {
        List<String> ids = new ArrayList<String>();
        Region region = getRegion(id);

        while (region != null) {
            ids.add(0, region.getId());
            if (StringUtils.isBlank(region.getParentId())) {
                region = null;
            }
            else {
                region = getRegion(region.getParentId());
            }
        }
        return ids.toArray(new String[0]);

    }

    public static String[] getNames(String id)
    {
        return getNames(id, true);
    }

    public static String[] getNames(String id, boolean abbr)
    {
        List<String> names = new ArrayList<String>();
        Region region = getRegion(id);

        while (region != null) {
            names.add(0, getName(region, abbr));
            if (StringUtils.isBlank(region.getParentId())) {
                region = null;
            }
            else {
                region = getRegion(region.getParentId());
            }
        }
        return names.toArray(new String[0]);
    }

    public static Region getRegionByName(String[] names, String type)
    {
        Region parent = getRegionByName(names[0], type);
        if (parent == null) {
            return null;
        }
        if (names.length == 1) {
            return parent;
        }

        for (int i = 1; i < names.length; i++) {
            Region region = getSubRegion(parent.getId(), names[i]);
            if (region == null) {
                return null;
            }
            parent = region;
        }
        return parent;
    }
}
